﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Systemet.Domain;

namespace Systemet.Technical
{
    /// <summary>
    /// Klassen används för att styra och hantera inloggning i systemet.
    /// Används för att sätta user och user-rättigheter i systemet.
    /// </summary>
    class LoginConnection
    {
        private LinqToSQLDataContext database;
        private string pass = AccessController.Instance.Connection;

        //Validerar inloggning
        public User validateLogin(User user)
        {
            database = new LinqToSQLDataContext(pass);

            //Ändras inte RightsID innan den returneras så är det något fel
            user.RoleID = -1;

            var userLogin = from Användare in database.Användares
                            where  Användare.anvandarnamn == user.UserName
                            select Användare;

            var userRoleID = from Användare in database.Användares
                             where user.UserName == Användare.anvandarnamn
                             join Personalregister in database.Personalregisters on Användare.personnummer equals Personalregister.personnummer
                             join Roll in database.Rolls on Användare.Personalregister.rollID equals Roll.rollID
                             select Roll;

            try
            {
                foreach (Användare a in userLogin)
                {
                    if (user.UserName == a.anvandarnamn.TrimEnd() && user.Password == a.losenord.TrimEnd())
                    {
                        foreach (Roll b in userRoleID)
                        {
                            user.RoleID = b.rollID;
                        }
                        break;
                    }
                    else
                    {
                        //fixa detta, endast för test
                        MessageBox.Show("UserRightsID = -1");
                    }
                }
            }catch (Exception e)
            {
                //fixa detta, endast för test
                MessageBox.Show("fel. " + e.ToString());
            }

            database.Connection.Close();
            return user;
        }

        //returnerar en userRole som används för rättighetshantering i systemet
        public UserRole getUserRole(User userToGetUserRole)
        {
            database = new LinqToSQLDataContext(pass);
            UserRole userRole = new UserRole();
            List<bool> testlista = new List<bool>();
            
            try
            {
                var getUserRole = from Behörighetregister in database.Behörighetregisters
                                  where Behörighetregister.rollID == userToGetUserRole.RoleID
                                  select Behörighetregister;
                 
                //Få ut alla roller
                foreach (Behörighetregister b in getUserRole)
                {
                    testlista.Add((bool)b.access);
                }

                userRole = setPermissions(userRole, testlista);
            }
            catch (SqlException SE)
            {
                //fixa detta, endast för test
                MessageBox.Show("fel. " + SE.ToString());
            }

            database.Connection.Close();
            return userRole;
        }

        //Sätter userRolePermissions i UserRole-objektet
        private UserRole setPermissions(UserRole userRolToGetPermissions, List<bool>test)
        {
            int i = 0;

            userRolToGetPermissions.KundkortSök = test[i];
            userRolToGetPermissions.KundkortLäggTill = test[++i];
            userRolToGetPermissions.ProduktkortSök = test[++i];
            userRolToGetPermissions.ProduktkortLäggTill = test[++i];
            userRolToGetPermissions.AktivitetskortSök = test[++i];
            userRolToGetPermissions.AktivitetskortLäggTill = test[++i];
            userRolToGetPermissions.PersonalkortSynlig = test[++i];
            userRolToGetPermissions.PrognostiseringSynlig = test[++i];
            userRolToGetPermissions.PrognostiseringRegPrognos = test[++i];
            userRolToGetPermissions.PrognostiseringLåsPrognos = test[++i];
            userRolToGetPermissions.PrognostiseringImportTxt = test[++i];
            userRolToGetPermissions.PrognostiseringRegUpparbetat = test[++i];
            userRolToGetPermissions.BudgeteringPerKundSynlig = test[++i];
            userRolToGetPermissions.BudgeteringPerProduktSynlig = test[++i];
            userRolToGetPermissions.PersonalrelateradeKostSynlig = test[++i];
            userRolToGetPermissions.AvkastningskravSynlig = test[++i];
            userRolToGetPermissions.DirektKostnadsBudgSynlig = test[++i];
            userRolToGetPermissions.ResursallkoeringSynlig = test[++i];
            userRolToGetPermissions.KostnadsrapporterSök = test[++i];
            userRolToGetPermissions.KostnadsrapporterLåsBudget = test[++i];
            userRolToGetPermissions.IntäktsrapporterSök = test[++i];
            userRolToGetPermissions.IntäktsrapporterLåsBudget = test[++i];
            userRolToGetPermissions.UppföljningSeResultat = test[++i];
            userRolToGetPermissions.UppföljningImportTxt = test[++i];
            userRolToGetPermissions.BudgeteratResultatSynlig = test[++i];
            userRolToGetPermissions.KundkortTaBort = test[++i];
            userRolToGetPermissions.ProduktkortTaBort = test[++i];
            userRolToGetPermissions.AktivitetskortTaBort = test[++i];

            return userRolToGetPermissions;
        }
    }
}
